package com.zyht.common;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.servlet.support.RequestContext;

import com.zyht.common.bean.PropertiesUtilBean.PropertiesUtils;

/**
 * <b>描述：</b>系统基类<br/>
 * <b>作者：</b>zrb <br/>
 * <b>修改日期：</b>2016年5月16日 - 下午2:16:34<br/>
 *
 */
public abstract class AbsBaseController {

	protected Logger logger = LoggerFactory.getLogger(getClass());
	
	/**
	 * @author: zrb
	 * 修改时间：2016年5月16日 - 下午2:16:34<br/>
	 * 功能说明：获取国际化上下文<br/>
	 * @param request
	 * @return
	 */
	protected final RequestContext getRequestContext(HttpServletRequest request){
		return new RequestContext(request);
	}
	
	/**
	 * @author: zrb
	 * 修改时间：2016年5月16日 - 下午2:16:34<br/>
	 * 功能说明：获取国际化<br/>
	 * @param request
	 * @param key
	 * @return
	 */
	protected final String getMessage(HttpServletRequest request, String key){
		return getMessage(request, key, "");
	}
	
	/**
	 * @author: zrb
	 * 修改时间：2016年5月16日 - 下午2:16:34<br/>
	 * 功能说明：获取国际化，附带默认消息<br/>
	 * @param request
	 * @param key
	 * @return
	 */
	protected final String getMessage(HttpServletRequest request, String key, String defaultMsg){
		return getRequestContext(request).getMessage(key, defaultMsg);
	}
	
	/**
	 * @author: zrb
	 * 修改时间：2016年5月16日 - 下午2:16:34<br/>
	 * 功能说明：获取国际化，带参数和默认消息<br/>
	 * @param request
	 * @param key
	 * @return
	 */
	protected final String getMessage(HttpServletRequest request, String key, Object[] params, String defaultMsg){
		return getRequestContext(request).getMessage(key, params, defaultMsg);
	}
	
	/**
	 * @author: zrb
	 * 修改时间：2016年5月16日 - 下午2:16:34<br/>
	 * 功能说明：获取每页容量<br/>
	 * @return
	 */
	protected final Integer getPageSize(){
		String pageSize = PropertiesUtils.getConfig("paganation_page_size");
		return null==pageSize?10:Integer.valueOf(pageSize);
	}
	
	/**
	 * <b>作者:</b> Bob<br/>
	 * <b>修改时间：</b>2016年5月19日 - 上午10:34:46<br/>
	 * <b>功能说明：</b>项目的基础地址信息，不附带地址分隔符"/"<br/>
	 * @param request
	 * @return
	 */
	protected final String getBasePath(HttpServletRequest request){
		return getAbsolutelyServerPath(request);
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年7月1日 - 下午4:37:29<br/>
	 * <b>功能说明：</b>获取服务器地址绝对网址<br/>
	 * @param request
	 * @return
	 */
	protected final String getAbsolutelyServerPath(HttpServletRequest request){
		String refererUrl = request.getScheme().concat("://").concat(request.getServerName()); 
		int port = request.getServerPort();
        if(port>0 && port!=80){
        	refererUrl = refererUrl.concat(":").concat(port+"");
        }
        refererUrl=refererUrl.concat(request.getContextPath());
        return refererUrl;
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年6月27日 - 下午1:54:33<br/>
	 * <b>功能说明：</b>获取ip地址<br/>
	 * @param request
	 * @return
	 */
	protected final String getIp(HttpServletRequest request) {
		if (request == null)
			return "";
		String ip = request.getHeader("X-Requested-For");
		if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("X-Forwarded-For");
		}
		if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("HTTP_CLIENT_IP");
		}
		if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("HTTP_X_FORWARDED_FOR");
		}
		if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		
		if ("0:0:0:0:0:0:0:1".equalsIgnoreCase(ip)) {
			ip = "127.0.0.1";
		}
		String[] ipArray = ip.split(",");
		if (ipArray != null && ipArray.length > 1) {
			return ipArray[0];
		}
		return ip;
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年7月9日 - 下午1:57:37<br/>
	 * <b>功能说明：</b>获取当前发送请求的地址<br/>
	 * @param request
	 * @return
	 */
	protected final String getRequestURL(HttpServletRequest request){
		String refUrl = getAbsolutelyServerPath(request);
		String queryString = request.getQueryString();
		if(!StringUtils.isEmpty(queryString)){
			refUrl.concat("?").concat(queryString);
		}
		return refUrl;
	}
	
	@InitBinder  
	protected final void initBinder(WebDataBinder binder) {  
	    binder.registerCustomEditor(Date.class, new DateTimeEditor(true));  
	}
}
